/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bff.bjj.dao;

import com.bff.bjj.musicobjects.BJJAlbum;
import com.bff.bjj.musicobjects.BJJArtist;
import com.bff.bjj.musicobjects.BJJGenre;
import com.bff.bjj.musicobjects.BJJSong;
import java.util.Collection;

/**
 *
 * @author Bill
 */
public interface SongDao {

    /**
     * Returns the total number of songs
     *
     * @return the number of songs
     * @throws BJJException if there is a problem getting the count
     */
    public int getSongCount();    

    /**
     * Returns a {@code Collection} of {@link BJJSong}s for a given
     * {@link BJJArtist}
     *
     * @param artist the {@link BJJArtist} to look up
     * @return a {@code Collection} of {@link BJJSong}s
     */
    public Collection<BJJSong> listSongsForArtist(BJJArtist artist);

    /**
     * Returns a {@code Collection} of {@link BJJSong}s for a given year.
     * 
     * @param year the year to look up
     * @return a {@code Collection} of {@link BJJSong}s
     */
    public Collection<BJJSong> listSongsForYear(String year);

    /**
     * Returns a {@code Collection} of {@link BJJSong}s for a given
     * {@link BJJGenre}
     *
     * @param artist the {@link BJJGenre} to look up
     * @return a {@code Collection} of {@link BJJSong}s
     */
    public Collection<BJJSong> listSongsForGenre(BJJGenre genre);

    /**
     * Returns a <code>Collection</code> of {@link BJJSong}s for a given
     * {@link BJJAlbum}
     *
     * @param album the {@link BJJAlbum}
     * @return a <code>Collection</code> of {@link BJJSong}s
     */
    public Collection<BJJSong> listSongsForAlbum(BJJAlbum album);
    
    /**
     * Returns the {@link BJJSong} for a song id. Returns <code>null</code> if
     * there is not a match.
     *
     * @param songId the song id
     * @return the {@link BJJSong}
     */
    public BJJSong lookupSong(String songId);
}
